如果你也是將 Elastic 當作搜尋快取再使用的話,一定也會常常碰到一些情況需要 Reindex。
我們一開始在使用的時候常碰到幾個問題,Logstash 沒指定 db 欄位的 type,到了 elastic 上後結果跟預期不符,或是 db / elastic 上的資料不一致等等問題,這時候我們需要的就是 reindex。
以下就是 reindex 的步驟與一些注意事項。
先開新的 index 假設叫做 member,後面我們加上版本號 member_version_1
PUT /member_verison_1 {}
如果有需要可以先指定 field 的 type
PUT /member_verison_1/_mapping
{
"properties": {
"height": {
"type": "short"
}
}
}
在 reindex 的時候就不要 copy 這欄的資料,用 ingest node 搭配 pipeline
先新增 ingest node
PUT _ingest/pipeline/pass_height
{
"description": "Removes the 'height' field",
"processors": [
{
"remove": {
"field": ["height"],
"ignore_missing": true
}
}
]
}
準備 OK 開始 reindex
POST _reindex?wait_for_completion=false
{
"source": {
"index": "member"
},
"dest": {
"index": "member_version_1",
"pipeline": "height_error"
}
}
通常 reindex 都需要一段時間為避免 timeout 加上 wait_for_completion,會回傳 task 的 id,可以在用 task 查詢 reindex 的狀況。
GET /_tasks/HSEnIEfuTaCLI-V7bRj3lg:17533795
接下來要設定 alias,如果原本的 index 就叫 member 沒有加上 version 的話,我們就只能先刪掉原本的 index,再加上 alias
DELETE /member
加上 alias
PUT /member_version_1/_alias/member
如果原本就有設定 alias 的話要先移除
POST /_aliases
{
"actions" : [
{ "remove" : { "index" : "member_version_1", "alias" : "member" } }
]
}
結束,以上就是盡可能平滑無痛 reindex 的步驟,透過 alias 的方式,基本上對前端查詢不會有什麼影響,就算要花一段時間重建也不用擔心囉!